package com.gome.han.bigdata.spark.core.rdd.createrdd.serial

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD

/**
 * @author Hanpeng
 * @date 2021/1/15 13:32
 * @description:
 *              1,序列化 需要在网络传输 所以要进行序列化
 *              2,构造参数会进行序列化检查 Search 相当于包 ,要对Search进行序列化检查
 *              getMatch1 会对query 进行序列化检测 由于query是类属性 然后会对整个对象进行序列化检测
 */
object Serial {
  def main(args: Array[String]): Unit = {
    val sparConf = new SparkConf().setMaster("local").setAppName("WordCount")
    val sc = new SparkContext(sparConf)

    val rdd: RDD[String] = sc.makeRDD(Array("hello world", "hello spark", "hive", "atguigu"))
    /**
     * 类的构造参数是类的属性 构造参数要进行闭包检测
     */
    val search = new Search("h")

    search.getMatch1(rdd).collect().foreach(println)
    //search.getMatch2(rdd).collect().foreach(println)

    sc.stop()
  }
  class Search(query:String){

    def isMatch(s: String): Boolean = {
      s.contains(this.query)
    }

    // 函数序列化案例
    def getMatch1 (rdd: RDD[String]): RDD[String] = {
      rdd.filter(isMatch)
    }

    // 属性序列化案例
    def getMatch2(rdd: RDD[String]): RDD[String] = {
      val s = query
      rdd.filter(x => x.contains(s))
    }
  }
}
